package br.com.expositor.apresentacao.infra.imp;

import org.apache.wicket.markup.html.WebPage;

import br.com.expositor.apresentacao.infra.IPagina;
import br.com.expositor.apresentacao.infra.imp.model.ComponenteCarregavelDestacavel;
import br.com.expositor.apresentacao.infra.imp.model.ModelGenerico;
import br.com.expositor.apresentacao.infra.session.SessionExpositor;
import br.com.expositor.negocios.entidade.Usuario;
import br.com.expositor.negocios.fachada.IFachada;
import br.com.expositor.negocios.fachada.imp.Fachada;

public abstract class PaginaGenerica extends WebPage implements IPagina,
		ComponenteCarregavelDestacavel {

	private PaginaGenerica paginaRetorno;

	public PaginaGenerica() {
		this(null);
	}

	public PaginaGenerica(PaginaGenerica paginaRetorno) {
		this.paginaRetorno = paginaRetorno;
		// Seta o model com a propria pagina
		this.setDefaultModel(new ModelGenerico<PaginaGenerica>(this));

		// Monta a pagina
		this.montarPagina();
	}

	public void dettach() {
	}

	public IFachada getFachada() {
		return (IFachada) ApplicationContextKeeper.getInstance().getBean(
				Fachada.class);
	}

	/**
	 * Metodo para obter a pagina de retorno do fluxo.
	 */
	public PaginaGenerica getPaginaRetorno() {
		return this.paginaRetorno;
	}

	@Override
	public SessionExpositor getSession() {
		return (SessionExpositor) super.getSession();
	}

	public Usuario getUsuarioLogado() {
		return this.getSession().getUsuario();
	}

	public void load() {

	}

	/**
	 * Metodo abstrato para montagem da pagina.
	 */
	public abstract void montarPagina();

	/**
	 * Metodo para setar a pagina de retorno do fluxo.
	 * 
	 * @param pagina
	 */
	public void setPaginaRetorno(PaginaGenerica pagina) {
		this.paginaRetorno = pagina;
	}

	public void setUsuarioLogado(Usuario usuario) {
		this.getSession().setUsuario(usuario);
	}

}
